import * as fs from 'fs';


/**
 * 提取 API 端点键名（优化版本，只提取包含点号的键名）
 * 排除被注释的对象定义和对象内的属性
 * @param {string} filePath - JS 文件路径  
 * @returns {Array<string>} API 端点键名数组
 */
export function extractAPIEndpointKeys(filePath: string): string[] {
  try {
    let fileContent = fs.readFileSync(filePath, 'utf8');
    const allKeys: string[] = [];
    
    // 移除多行注释 /* ... */
    fileContent = fileContent.replace(/\/\*[\s\S]*?\*\//g, '');
    
    // 按行处理，移除单行注释但保留字符串内的 //
    const lines = fileContent.split('\n');
    const cleanedLines: string[] = [];
    
    for (let line of lines) {
      let inString = false;
      let stringChar = '';
      let cleanLine = '';
      
      for (let i = 0; i < line.length; i++) {
        const char = line[i];
        const nextChar = i < line.length - 1 ? line[i + 1] : '';
        const prevChar = i > 0 ? line[i - 1] : '';
        
        if (!inString && (char === '"' || char === "'")) {
          inString = true;
          stringChar = char;
          cleanLine += char;
        } else if (inString && char === stringChar && prevChar !== '\\') {
          inString = false;
          stringChar = '';
          cleanLine += char;
        } else if (!inString && char === '/' && nextChar === '/') {
          // 遇到 // 注释，停止处理这一行的剩余部分
          break;
        } else {
          cleanLine += char;
        }
      }
      
      cleanedLines.push(cleanLine);
    }
    
    fileContent = cleanedLines.join('\n');
    
    // 正则表达式匹配对象定义，排除被注释的对象
    const objectPattern = /(?:const|let|var)\s+(\w+)\s*=\s*\{([\s\S]*?)\};?/g;
    
    let objectMatch;
    while ((objectMatch = objectPattern.exec(fileContent)) !== null) {
      const objectName = objectMatch[1];
      const objectContent = objectMatch[2];
      
      // 跳过 default 对象
      if (objectName === 'default') {
        continue;
      }
      
      // 按行处理对象内容，排除被注释的属性
      const objectLines = objectContent.split('\n');
      
      for (let line of objectLines) {
        line = line.trim();
        if (!line || line.startsWith('//')) {
          continue; // 跳过空行和注释行
        }
        
        // 匹配类似 'xxx.xxx.xxx': 的模式（API 端点键名）
        // 必须包含至少一个点号，否则认为是无效的 API 名称
        const apiKeyMatch = line.match(/^['"]([^'"]*\.[^'"]*)['"]\s*:/);
        if (apiKeyMatch) {
          const key = apiKeyMatch[1];
          // 验证键名必须包含点号（防止函数内定义的对象键名被提取）
          if (key && key.includes('.') && !allKeys.includes(key)) {
            allKeys.push(key);
          }
        }
      }
    }
    
    console.log(`从文件 ${filePath} 提取到的 API 端点键名:`, allKeys);
    return allKeys;
    
  } catch (error) {
    console.error(`读取文件 ${filePath} 失败:`, error);
    return [];
  }
}

/**
 * 从文件中提取 URL API 键名（兼容原有接口）
 * @param {string} absPath - 文件绝对路径
 * @returns {Array<string>} API 键名数组
 */
export function extractUrlApiKeyFromFile(absPath: string): string[] {
  return extractAPIEndpointKeys(absPath);
}